package org.shop.controller;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletResponse;
import org.shop.vo.PageVo;
import org.shop.vo.ResponseData;

import java.io.IOException;
import java.io.PrintWriter;

/**
 * 所有 Servlet 的父类 - 提取子类公共代码 - 实现代码的复用（维护性页提高了）
 *
 * @author ZJL
 * @date 2024-12-13
 */
public class BaseController extends HttpServlet {

    /**
     * 日期默认格式
     */
    private static final String PARENT_DEFAULT = "yyyy-MM-dd HH:mm:ss";

    /**
     * 日期格式 年、月、日
     */
    private static final String PARENT_YEAR_MONTH_DAY = "yyyy-MM-dd";

    /**
     * 成功响应 - JSON
     *
     * @param code 状态码
     * @param data 数据
     * @param msg  消息
     * @return ResponseData对象 的 JSON 字符串
     */
    protected String success(int code, Object data, String msg) {
        ResponseData responseData = new ResponseData(code, data, msg);
        return toJson(responseData);
    }

    /**
     * 成功响应 - JSON  把状态默认为200
     *
     * @param data 数据
     * @param msg  消息
     * @return ResponseData对象 的 JSON 字符串
     */
    protected String success(Object data, String msg) {
        ResponseData responseData = new ResponseData(200, data, msg);
        return toJson(responseData);
    }

    /**
     * 成功响应 - JSON
     *
     * @param code 状态码
     * @param data 数据
     * @return ResponseData对象 的 JSON 字符串
     */
    protected String success(int code, Object data) {
        ResponseData responseData = new ResponseData(code, data, null);
        return toJson(responseData);
    }

    /**
     * 成功响应服务于 Layui 动态表格响应 - JSON
     *
     * @param data  数据
     * @param count 总记录数
     * @return ResponseData对象 的 JSON 字符串
     */
    protected String success(Object data, long count) {
        PageVo pageVo = new PageVo(0, data, count);
        return toJson(pageVo);
    }

    /**
     * 错误的响应 - JSON
     *
     * @param code 错误的状态码
     * @param msg  错误的消息
     * @return ResponseData对象 的 JSON 字符串
     */
    protected String error(int code, String msg) {
        ResponseData responseData = new ResponseData(code, null, msg);
        return toJson(responseData);
    }

    /**
     * 错误的响应 - JSON  状态默认为 500
     *
     * @param msg 错误的消息
     * @return ResponseData对象 的 JSON 字符串
     */
    protected String error(String msg) {
        ResponseData responseData = new ResponseData(500, null, msg);
        return toJson(responseData);
    }

    /**
     * 把 ResponseData 对象 （响应对象） - 序列化为 Json 字符串中
     *
     * @param responseData 响应对象
     * @return JSON字符串
     */
    private String toJson(ResponseData responseData) {
        Gson gson = new GsonBuilder().setDateFormat(PARENT_DEFAULT).create();
        return gson.toJson(responseData);
    }

    /**
     * 把 ResponseData 对象 （响应对象） - 序列化为 Json 字符串中
     *
     * @param responseData 响应对象
     * @param pattren      设置日期时间格式
     * @return JSON字符串
     */
    private String toJson(ResponseData responseData, String pattren) {
        Gson gson = new GsonBuilder().setDateFormat(pattren).create();
        return gson.toJson(responseData);
    }

    /**
     * 将 Servlet 中的数据 响应到页面中
     *
     * @param resp
     * @param json
     * @throws IOException
     */
    protected void print(HttpServletResponse resp, String json) throws IOException {
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        out.print(json);
        out.flush();
        out.close();
    }
}
